﻿/*
 ***************************************************************************
 * Microsoft Visual C# .NET
 * 名称：       Shpm.System.Web.Control.CheckDateRange
 * 类型：       服务端输入校验类
 * 功能说明：   日期范围校验类
 * 作者：       郭晓庆
 * 创建日期：   2007/07/10
 * 修改日期     修改者      修改内容
 * 
 * 
 * ---
 ***************************************************************************
*/
using System;
using System.Collections.Generic;
using System.Text;
using Shpm.System.Web.Control;
using System.Globalization;
using Shpm.App.Commons.Utils;

namespace Shpm.System.Web.Control
{
    public class CheckDateRange: ComAbsChecker
    {
        /** From日付 */
	    private String fromDate = null;
        /** To日付 */
        private String toDate   = null;
        /** 合法的日期格式 */
        protected String dataFormat;

        /**
	     * コンストラクタ
	     * @param fromDate From开始日期
	     * @param toDate   To结束日期
         * @param dataFormat 日期格式
	     */
        public CheckDateRange(String fromDate, String toDate,String dataFormat)
            : base(null)
        {
            
		    this.fromDate = fromDate;
		    this.toDate   = toDate;
            this.dataFormat = dataFormat;
	    }

        /**
	     * コンストラクタ
	     * @param fromDate From开始日期
	     * @param toDate   To结束日期
	     */
        public CheckDateRange(String fromDate, String toDate)
            : base(null)
        {

            this.fromDate = fromDate;
            this.toDate = toDate;
            // 不特定格式
            this.dataFormat = null;
        }

        public CheckDateRange(String fromDate, String toDate, String dataFormat, Shpm.System.Validator.ComAbsMsg msg)
            : base(null, msg)
        {
            this.fromDate = fromDate;
		    this.toDate   = toDate;
            this.dataFormat = dataFormat;
        }

        public CheckDateRange(String fromDate, String toDate, Shpm.System.Validator.ComAbsMsg msg)
            : base(null, msg)
        {
            this.fromDate = fromDate;
            this.toDate = toDate;
            this.dataFormat = null;
        }

        /**
         * 日期范围检查。
         * @param value 输入值
         * @return true:正常 / false:異常
         */
        protected override bool doCheck(String value)
        {
            // 「From or To」未输入时不做检查
            if (base.isEmpty(this.fromDate) || base.isEmpty(this.toDate))
            {
                return true;
            }

            // Form数値変換
            int intFrom = 0;
            intFrom = this.parse(this.fromDate);

            // To数値変換
            int intTo = 0;
            intTo = this.parse(this.toDate);

            // 数値変換失敗
            if( intFrom == 0 || intTo == 0 ){
                return false;
            }

            //日期范围检查
            if( intFrom <= intTo ){
                return true;
            }
            else{
                return false;
            }
	    }

        /**
         * 日期数値変換
         * @return 変換后日期
         */
        private int parse(String value){
		    try
            {
                Nullable<DateTime> dt = null;

                if (this.dataFormat != null)
                {
                    dt = DateTime.ParseExact(value, dataFormat, DateTimeFormatInfo.InvariantInfo);
                }
                else
                {
                    dt = DateUtils.convertToDate(value);
                }

                if (dt != null)
                {
                    Calendar cal = CultureInfo.InvariantCulture.Calendar;
                    if (cal.GetYear(dt.Value) < 1000)
                    {
                        return 0;

                        //DecimalFormat df1 = new DecimalFormat("0000");
                    }
                    String y = cal.GetYear(dt.Value).ToString("0000");
                    int mon = cal.GetMonth(dt.Value) + 1;
                    String m = mon.ToString("00");
                    String d = cal.GetDayOfMonth(dt.Value).ToString("00");
                    return int.Parse(y + m + d);
                }
                else
                    return 0;
		    }
		    catch 
            {
			    return 0;
		    }
	    }
    }
}
